#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define N 1000007
using namespace std;
int n, a[N], l[N], r[N];
ll ans;
inline int read(){
int ans = 0, f = 1;
char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar())
if (ch == '-')
f = 0;
for(; ch >= '0' && ch <= '9'; ch = getchar())
ans = (ans << 3) + (ans << 1) + ch - 48;
return f? ans: -ans;
}
int main(){
n = read();
ans = 0;
for (int i = 1;i <= n; ++i)
a[i] = read();
for (int i = 1; i <= n; ++i)
l[i] = r[i] = i;
for (int i = 2; i <= n; ++i){
int now = i;
while (now > 1 && a[i] >= a[now - 1])
now = l[now - 1];
l[i] = now;
}
for (int i = n - 1; i >= 1; --i){
int now = i;
while (now < n && a[i] > a[now + 1])
now = r[now + 1];
r[i] = now;
}
for (int i = 1;i <= n; ++i)
ans += (ll)a[i] * (ll)(i - l[i] + 1) * (ll)(r[i] - i + 1);
for (int i = 2; i <= n; ++i){
int now = i;
while (now > 1 && a[i] <= a[now - 1])
now = l[now - 1];
l[i] = now;
}
for (int i = n - 1; i >= 1; --i){
int now = i;
while (now < n && a[i] < a[now + 1])
now = r[now + 1];
r[i] = now;
}
for (int i = 1;i <= n; ++i)
ans -= (ll)a[i] * (ll)(i - l[i] + 1) * (ll)(r[i] - i + 1);
printf("%lld\n", ans);
}
97. Interleaving String | 543. Diameter of Binary Tree |
124. Binary Tree Maximum Path Sum | 1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts |
501A - Contest | 160A- Twins |
752. Open the Lock | 1535A - Fair Playoff |
1538F - Interesting Function | 1920. Build Array from Permutation |
494. Target Sum | 797. All Paths From Source to Target |
1547B - Alphabetical Strings | 1550A - Find The Array |
118B - Present from Lena | 27A - Next Test |
785. Is Graph Bipartite | 90. Subsets II |
1560A - Dislike of Threes | 36. Valid Sudoku |
557. Reverse Words in a String III | 566. Reshape the Matrix |
167. Two Sum II - Input array is sorted | 387. First Unique Character in a String |
383. Ransom Note | 242. Valid Anagram |
141. Linked List Cycle | 21. Merge Two Sorted Lists |
203. Remove Linked List Elements | 733. Flood Fill |